import { Injectable, Injector } from '@angular/core';
import { cacheConf } from '@conf/cache.conf';
import { Observable } from 'rxjs';
import { tap } from 'rxjs/operators';
import { BaseService } from '../core/base.service';
import { EACacheService } from '../core/cache.service';

@Injectable()
export class EAEnterpriseService extends BaseService {
  // 获取当前用户绑定的分销商/代理商/供应商
  public $api_get_my_enterprises = `/chia/enterpriseInfo/list/queryMyAppInfo`;

  // 向服务器变更默认企业
  public $api_selectEnterprise = '/chia/userApp/selectEnterprise';
  constructor(public injector: Injector) {
    super(injector);
  }

  // 注入缓存服务
  private get cacheSrv(): EACacheService {
    return this.injector.get(EACacheService);
  }

  /**
   * 加载企业信息
   */
  loadEnterpises(): Observable<any> {
    return this.request(this.$api_get_my_enterprises);
  }

  /**
   * 根据租户ID获取指定的企业
   * @param tenantId 租户ID
   */
  getOne(tenantId: string): any {
    const enterprises = this.getAll();
    return enterprises.find((r) => r.tenantId === tenantId);
  }

  /**
   * 获取所有企业
   */
  getAll(): Array<any> {
    return this.cacheSrv.get(cacheConf.enterprise) || [];
  }

  /**
   * 获取默认企业
   */
  getDefault(): any {
    const list = this.getAll();
    return list.find((r) => r.defaultState) || list[0] || null;
  }

  /**
   * 设置默认企业
   */
  setDefault(tenantId: string): void {
    // 获取指定tenantId的企业
    const enterprise = this.getOne(tenantId);
    if (enterprise) {
      let enterpriseList = this.getAll();

      // 设置指定tenantId的企业为默认企业，其他的企业为非默认企业
      enterpriseList = enterpriseList.map((m) => {
        if (m.tenantId === enterprise.tenantId) {
          m.defaultState = true;
        } else {
          m.defaultState = false;
        }
        return m;
      });
      // 重新缓存新的企业列表
      this.setCache(enterpriseList);

      // 广播当前环境信息
      this.envSrv.setEnvironment(enterprise.appId, enterprise.tenantId);
    }
  }

  /**
   * 设置缓存企业信息
   * @param enterpriseData 企业信息信息
   */
  setCache(enterpriseData: any): void {
    this.cacheSrv.set(cacheConf.enterprise, enterpriseData);
  }

  /**
   * 选择企业
   * @param item 企业实体
   * 选择企业进入管理后台
   * 1. 判断当前企业是否被冻结，如企业为冻结状态，则toast提示“供应商已被冻结，无法访问，请联系客服处理”
   * 2. 向服务器请求变更当前企业身份
   * 3. 服务器变更当前企业后，刷新本地缓存中的企业信息
   * 4. 跳转到管理后台首页
   */
  changeDefaultEnterprise(item: any): Observable<any> {
    // 1. 判断冻结状态
    // if (item.stateLocked) {
    //   this.msgSrv.warning('代理商已被冻结，无法访问，请联系客服处理');
    //   return of(false);
    // }
    // 2.判断用户状态userStatus：0-正常，1-冻结，2-废弃
    // if (item.userStatus === 1) {
    //   this.msgSrv.warning('您的帐号已被企业冻结，无法访问，请联系客服处理');
    //   return of(false);
    // }
    // if (item.userStatus === 2) {
    //   this.msgSrv.warning('您的帐号已被企业废弃，无法访问，请联系客服处理');
    //   return of(false);
    // }
    // 3. 向服务器请求变更当前企业身份
    return this.request(this.$api_selectEnterprise, { tenantId: item.tenantId }).pipe(
      tap((data) => {
        if (data) {
          // 切换成功则广播当前环境信息
          this.envSrv.setEnvironment(item.appId, item.tenantId);
        }
      }),
    );
  }
}
